/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Objetos.Compra;
import Objetos.Produto;
import Objetos.Usuario;
import DAO.AccessDatabase;
import Objetos.Produto_OS;
import java.awt.HeadlessException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celio
 */
public class RepositorioProduto implements RepositorioProdutoInterface {

    @Override
    public void adicionar(Produto produto, Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `produtos` (`descricaoproduto`,`valorproduto`,`idfornecedor`,`aliquotaproduto`,`unidadeproduto`,`data_inclusaoproduto`,`qtd`) VALUES ('" + produto.getDescProduto() + "','" + produto.getValor() + "','" + produto.getFornecedor() + "','" + produto.getAliquota() + "','" + produto.getUnidade() + "','" + produto.getData_inclusao() + "','0');");
            con.close();

            JOptionPane.showMessageDialog(null, "Produto cadastrado com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Cadastrou o produto:  " + produto.getDescProduto() + " às ");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public Produto procurar(String cod_produto,Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM produtos WHERE idproduto = '" + cod_produto + "'");
            if(rs.next()){

            Produto produto = new Produto();
            produto.setCodProduto(rs.getString("idproduto"));
            produto.setDescProduto(rs.getString("descricaoproduto"));
            Double valor = Double.parseDouble(rs.getString("valorproduto"));
            produto.setValor(Funcoes.funcoes.paraFormatoDinheiro(valor));
            produto.setFornecedor(rs.getString("idfornecedor"));
            produto.setQtd(rs.getString("qtd"));

            con.close();
            return produto;

            }else{
                return null;
            }
        } catch (NumberFormatException | SQLException t) {
            JOptionPane.showMessageDialog(null, "Valor inválido para a consulta!!");
            return null;

        }

    }

    @Override
    public void alterar(Produto produto, Produto alterado, Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `produtos` SET `descricaoproduto`='" + alterado.getDescProduto() + "', `valorproduto`='" + alterado.getValor() + "', `idfornecedor`='" + alterado.getFornecedor() + "'    WHERE `idproduto`='" + produto.getCodProduto() + "'");
            con.close();

            JOptionPane.showMessageDialog(null, "Produto alterado com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Alteru o produto:  " + produto.getDescProduto() + " para " + alterado.getDescProduto() + " às ");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public JTable consultaTodos(Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            JTable tabela;
            try (Connection con = a.conectar()) {
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("SELECT  p.idproduto,p.descricaoproduto, p.valorproduto, p.idfornecedor, f.nomefornecedor, p.qtd FROM produtos p, fornecedores f WHERE f.idfornecedor=p.idfornecedor ORDER BY descricaoproduto");
                rs.next();
                ResultSetMetaData rsmd = rs.getMetaData();
                cabecalho.addElement("Cód");
                cabecalho.addElement("Descrição");
                cabecalho.addElement("Valor");
                cabecalho.addElement("Cód. Forn");
                cabecalho.addElement("Fornecedor");
                cabecalho.addElement("Qtd");
                do {
                    linhas.addElement(proximaLinha(rs, rsmd));
                } while (rs.next());
                tabela = new JTable(linhas, cabecalho);
            }
            tabela.getColumnModel().getColumn(0).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(450);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(300);
            tabela.getColumnModel().getColumn(5).setPreferredWidth(100);
            
            
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public Vector<Produto> todos(Usuario usu) {

        Vector retorno = new Vector();
        retorno.addElement(" ");
        Produto pro;
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM produtos  ORDER BY idproduto LIMIT 0, 1000");
            while (rs.next()) {
                pro = new Produto();

                pro.setCodProduto(rs.getString("idproduto"));
                pro.setDescProduto(rs.getString("descricaoproduto"));
                pro.setValor(rs.getString("valorproduto"));
                pro.setFornecedor(rs.getString("idfornecedor"));
                pro.setQtd(rs.getString("qtd"));

                retorno.addElement(pro);
            };

            con.close();
            return retorno;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiroRelatorio(rs.getDouble(i)).substring(3));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

    @Override
    public void alterarSaldo(Produto produto, int qtd,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `produtos` SET `qtd`='" + qtd + "' WHERE `idproduto`='" + produto.getCodProduto() + "';");
            con.close();

            JOptionPane.showMessageDialog(null, "Entrada de produto feita com sucesso!!!");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public void vender(Produto produto, int qtd,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `produtos` SET `qtd`='" + qtd + "' WHERE `idproduto`='" + produto.getCodProduto() + "';");
            con.close();

            JOptionPane.showMessageDialog(null, "Saída de produto feita com sucesso!!!");

        } catch (Exception t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public void comprar(Produto produto, Compra compra, int qtd,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `compras_produtos` (`idcompra`,`idproduto`,`qtd`) VALUES ('" + compra.getCodCompra() + "','" + produto.getCodProduto() + "','" + qtd + "');");
            con.close();

            JOptionPane.showMessageDialog(null, "Entrada cadastrada com sucesso!!!");
                 //Funcoes.funcoes.geraLog(" ", "Usuário: "+usu.getNome()+" | Cadastrou o produto:  "+produto.getDescProduto()+" às ");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public void inserirProduto_OS(Produto_OS proOS,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `produto_os` (`idOS`,`idProduto`,`qtd`) VALUES ('" + proOS.getIdPedido() + "','" + proOS.getIdProduto() + "','" + proOS.getQtd() + "');");
            con.close();

        } catch (Exception t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

}
